#ifndef OS_EVENT_H
#define OS_EVENT_H

#include "os_cfg.h"
#include "os_list.h"

#define OS_EVENT_NO_WAIT                -1          // 不等待
#define OS_EVENT_WAIT_FOREVER           0           // 一直等待

/**
 * event类型，用于让任务进行各种等待的事件处理
 */
typedef enum  _os_event_type_t {   
    OS_EVENT_TYPE_INVALID, 		    // 未知类型
    OS_EVENT_TYPE_SEM, 				// 信号量类型
    OS_EVENT_TYPE_QUEUE, 		    // 消息队列类型
	OS_EVENT_TYPE_MBLOCK,		    // 存储块类型
	OS_EVENT_TYPE_EFLAGS,		    // 事件标志组
	OS_EVENT_TYPE_MUTEX,		    // 互斥信号量类型
    OS_EVENT_TYPE_TIMER,            // 定时器

    OS_EVENT_TYPE_MAX               // 最大无效值
}os_event_type_t;

struct _os_task_t;

/**
 * event结构，用于任务等待与恢复相关的控制
*/
typedef struct _os_event_t {
    os_event_type_t type;
    int flags;

    // 用双向链表，方便快速进行开头和尾部的操作
    // 中间的操作情况较少，为节省内存，采用从头部遍历的方式
    os_list_t wait_list;                    // 等待队列
}os_event_t;

/**
 * 任务等待的对像结构
 */
typedef struct _os_wait_t {
    os_event_t * event;             // 等待的
    void * reason;                  // 等待的原因
    os_err_t err;                   // 等待结果
}os_wait_t;

void os_event_wait_init (os_wait_t * wait, os_event_t * event, void * reason, int ms);

os_err_t os_event_init (os_event_t * event, os_event_type_t type, int flags);
os_err_t os_event_uninit (os_event_t * event);
void os_event_wait (os_event_t * event, void * reason, int ms);
struct _os_task_t * os_event_wakeup (os_event_t * event);
void os_event_wakeup_task (os_event_t * event, struct _os_task_t * task, void * reason, os_err_t err);
void os_event_clear (os_event_t * event, void * reason, os_err_t err);
int os_event_wait_cnt (os_event_t * event);
void os_event_list_remove (os_event_t * event, struct _os_task_t * task);
void os_event_list_insert (os_event_t * event, struct _os_task_t * task);

#endif /* TEVENT_H */
